#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int T,n,m,len,lim,pos[maxn],ans;
int is_cs[maxn*10];
int nxt[maxn],pre[maxn],st[maxn];
struct node{
    int d,v,a;
}car[maxn];
struct node2{
    int l,r;
}ran[maxn];
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>T;
    while(T--){
            vector<int>aa[maxn],bb[maxn];
        cin>>n>>m>>len>>lim;
        for(int i=1;i<=n;i++){
            cin>>car[i].d>>car[i].v>>car[i].a;
        }
        int lpos=0;
        for(int i=1;i<=m;i++){
            cin>>pos[i];
        }
        sort(pos+1,pos+n+1);
        for(int i=1;i<=m;i++)is_cs[pos[i]]=i;
        for(int i=1;i<m;i++){
            nxt[i]=pos[i+1];
        }

        for(int i=1;i<=n;i++){
            if(car[i].a==0){
                if(car[i].v>lim){
                    ran[i].l=car[i].d;
                    ran[i].r=len;
                }
            }
            else if(car[i].a>0){
                if(car[i].v>lim){
                    ran[i].l=car[i].d;
                    ran[i].r=len;
                }
                else if(car[i].v<lim){
                    double x=((lim*lim-car[i].v*car[i].v)*1.0)/((2*car[i].a)*1.0);
                    int tempx=x;
                    tempx++;
                    ran[i].l=car[i].d+tempx;
                    ran[i].r=len;
                }
                else{
                    ran[i].l=car[i].d+1;
                    ran[i].r=len;
                }
            }
            else{
                if(car[i].v>lim){
                    double x=((car[i].v*car[i].v-lim*lim)*1.0)/((2*(-car[i].a))*1.0);
                    int tempx=x;
                    ran[i].l=car[i].d;
                    ran[i].r=car[i].d+tempx;
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=ran[i].l;j<=ran[i].r;j++){
                if(is_cs[j]>0){
                    ans++;
                    st[i]=j;
                    break;
                }
            }
            //cout<<ran[i].l<<' '<<ran[i].r<<'\n';
        }
       for(int i=1;i<=n;i++){
            if(st[i]){
                int k=st[i];
                //cout<<st[i]<<'\n';
                while(k<=ran[i].r){
                    aa[i].push_back(k);
                    bb[k].push_back(i);
                    k=pos[is_cs[k]+1];
                    if(k==0)break;
                }
            }
        }
       /* for(int i=1;i<=n;i++){
            if(aa[i].size()){
                for(int j=0;j<aa[i].size();j++){
                    cout<<aa[i][j]<<' ';
                                }
                                cout<<'\n';
            }

        }*/
        int minn=0;
        for(int i=1;i<=n;i++){
                int temp=bb[i].size();
            minn=max(minn,temp);
        }
        int cnt=n-minn;
        cout<<ans<<' '<<cnt<<'\n';
        memset(pos,0,sizeof(pos));
        memset(st,0,sizeof(st));
        memset(is_cs,0,sizeof(is_cs));
        for(int i=0;i<=maxn;i++){
            ran[i].l=0;
            ran[i].r=0;
            car[i].a=0;
            car[i].v=0;
            car[i].d=0;
        }
    }
    return 0;
}
/*
1
5 5 15 3
0 3 0
12 4 0
1 1 4
5 5 ‐2
6 4 ‐4
2 5 8 9 15
*/
